﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ext.Net;
using Utpl.Syllabus.ConfiguracionSistema.BL;
using Utpl.Syllabus.ModuloEstructuraCurricular.BL;
using Utpl.Syllabus.ModuloProgramaAcademico.BL;
using Utpl.Syllabus.Nucleo.BL;
using Utpl.Syllabus.Reconocimiento.BL;
using Utpl.Syllabus.Reconocimiento.Web;
using Utpl.Syllabus.Framework;
using Utpl.Syllabus.Framework.Web.UI;

namespace Utpl.Syllabus.Reconocimiento.Web
{
    [NotAuthorize]
    public partial class windowEditor : SyUserControl
    {
        
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                CargarDatosIniciales();
            }
        }

        /// <summary>
        /// Carga datos iniciales de la matricula Academica
        /// </summary>
        public void CargarDatosIniciales()
        {
            //Lookup para cargar la Modalidad de Estudio
            stoModalidadB.DataSource = ModalidadEstudioLookup.GetNameValueList();
            stoModalidadB.DataBind();

            //Lookup para cargar Tipo de Estudio
            stoNivelAcademicoB.DataSource = NivelAcademicoLookup.GetNameValueList();
            stoNivelAcademicoB.DataBind();

            //Lookup Tipo de Unidad Academica
            var info = TipoUnidadAcademicaLookup.GetTipoUnidadAcademica().Single(
                tua => tua.Codigo == CodigosItems.ITEM_ESCUELA);
            stoUnidadAcademicaB.DataSource = UnidadAcademicaList.GetUnidadAcademicaList(info.Id);
            stoUnidadAcademicaB.DataBind();

            //Lookup Estado de Programa Academico Vigente y No Vigente
            //stoEstado.DataSource = ProgramaAcademicoEstadoLookup.GetProgramaAcademicoEstadoLookup();
            //stoEstado.DataBind();

        }

        protected void cbbProgramaVariacion_Focus(object sender, DirectEventArgs e)
        {
            try
            {
                int nivelAcademicoId, modalidadId, unidadAcademicaId;
                int.TryParse(e.ExtraParams["NivelAcademico"], out nivelAcademicoId);
                int.TryParse(e.ExtraParams["Modalidad"], out modalidadId);
                int.TryParse(e.ExtraParams["UnidadAcademica"], out unidadAcademicaId);
                ListarVariaciones(nivelAcademicoId, unidadAcademicaId, modalidadId);
            }
            catch (Exception ex)
            {
                ManejadorExcepcionesHelper.CatchExceptionLoad(ex, this.ManejadorExcepciones, this.ManejadorMensajes);
            }
        }

        private void ListarVariaciones(int nivelAcademicoId, int unidadAcademicaId, int modalidadId)
        {
            var criterio = ProgramaEstructuraVariacionCriteria.New();
            criterio.UnidadAcademicaId = unidadAcademicaId == 0 ? null : (int?) unidadAcademicaId;
            criterio.ModalidadId = modalidadId == 0 ? null : (int?) modalidadId;
            criterio.NivelAcademicoId = nivelAcademicoId == 0 ? null : (int?) nivelAcademicoId;
            criterio.PeriodoFechaInicio = DateTime.Now;
            var listaVariaciones = ProgramaEstructuraVariacionList.Get(criterio).OrderBy(pecl => pecl.VariacionNombre);
            cbbProgramaVariacion.Reset();
            stoProgramaVariacion.DataSource = listaVariaciones;
            stoProgramaVariacion.DataBind();
        }

        protected void cbbProgramaVariacion_Select(object sender, DirectEventArgs e)
        {
            try
            {
                cbxComponente.Reset();
                cbxGrupo.Reset();
                txtNumeroCreditos.Reset();
                var nivelAcademico = e.ExtraParams["NivelAcademico"];
                int variacionId;
                int.TryParse(e.ExtraParams["VariacionId"], out variacionId);

                ListarPlanesGruposComponentes(variacionId);
                //SeleccionarDatosEditar();
            }
            catch (Exception ex)
            {
                ManejadorExcepcionesHelper.CatchExceptionLoad(ex, this.ManejadorExcepciones, this.ManejadorMensajes);
            }
        }

        private void ListarPlanesGruposComponentes(int variacionId)
        {
            var estructuraVariacion = EstructuraCurricularVariacionSimpleInfo.Get(variacionId);
            var programaAcademicoInfo =
                ProgramaAcademicoInfo.GetProgramaAcademicoInfo(
                    estructuraVariacion.ProgramaAcademicoId);
            var criterio = PlanEstudioCriteria.New();
            criterio.CodigoNivelAcademico = programaAcademicoInfo.NivelAcademicoNombre;
            var listaPlanEstudiante = PlanEstudioList.Get(criterio);
            stoPlanEstudio.DataSource = listaPlanEstudiante;
            stoPlanEstudio.DataBind();
            var componentesVariacion = estructuraVariacion.VariacionComponentes.OrderBy(ecvc => ecvc.Nombre);
            stoComponente.DataSource = componentesVariacion;
            stoComponente.DataBind();
            stoGrupo.DataSource = estructuraVariacion.DistribucionGrupos;
            stoGrupo.DataBind();
        }

        /// <summary>
        /// Muestra la ventana para Crear, Editar, Eliminar una equivalencia
        /// </summary>
        /// <param name="id"></param>
        public void Show(Equivalencia objEquivalencia, Operacion operacion)
        {
            try
            {
                ClearWindowEditor();
                detailsWindow.Show();
                btnGuardar.Show();
                btnEliminar.Hide();
                btnEliminar.Disabled = false;
                frpBuscadorProgramasAcademicos.Disabled = false;
                pnlDestino.Disabled = false;
                pnlOrigen.Disabled = false;
                txtObserv.Disabled = false;
                Session["Operacion"] = operacion;
                if (operacion != Operacion.Nuevo)
                {
                    ListarVariaciones(0, 0, 0);
                    ListarPlanesGruposComponentes(objEquivalencia.VariacionProgramaAcademicoId);
                    cbbProgramaVariacion.SetValue(objEquivalencia.VariacionProgramaAcademicoId);
                    hidCodigoComponente.SetValue(objEquivalencia.CodigoComponente);
                    
                    cbxGrupo.SetValue(objEquivalencia.GrupoCreditoId);
                    txtNumeroCreditos.SetValue(objEquivalencia.NumeroCreditos);
                    cbbPlanEstudio.SetValueAndFireSelect(objEquivalencia.PlanEstudioOrigenId);
                    txtObserv.SetValue(objEquivalencia.Observacion);
                    rdgEstado.SetValue(objEquivalencia.Estado);
                    //stoComProgOrig
                    stoComProgOrig.DataSource = objEquivalencia.ComponentesOrigen;
                    stoComProgOrig.DataBind();
                    X.Js.Call("pgWindowEditor.BuscarIdCoe", objEquivalencia.ComponenteId, objEquivalencia.NombreComponente);
                    rdgEstado.Show();
                    rdgEstado.AllowBlank = false;
                    var puedeEditarEliminar = EquivalenciaCmd.Execute(objEquivalencia.Id);
                    if (puedeEditarEliminar)
                    {
                        //cbxComponente.Set(objEquivalencia.ComponenteId);
                        //setear texto en combo de componente
                        ExtNet.Js.Call("Sy.showMsgAlerta", "La equivalencia esta siendo usada en un Reconocimiento");
                    }
                    if (puedeEditarEliminar)
                    {
                        frpBuscadorProgramasAcademicos.Disabled = true;
                        pnlOrigen.Disabled = true;
                        txtObserv.Disabled = true;
                        pnlDestino.Disabled = true;
                    }
                    if (operacion == Operacion.Editar)
                    {
                        btnEliminar.Hide();
                    }
                    else
                    {
                        btnEliminar.Show();
                        btnGuardar.Hide();
                        if (puedeEditarEliminar)
                        {
                            btnEliminar.Disabled=true;
                        }
                    }
                    
                }
                else
                {
                    rdgEstado.Hide();
                    rdgEstado.AllowBlank = true;
                }
                
            }
            catch (Exception ex)
            {
                detailsWindow.Hide();
                ManejadorExcepcionesHelper.CatchExceptionLoad(ex, this.ManejadorExcepciones, this.ManejadorMensajes);

            }
        }

        protected void cbbPlanEstudio_Select(object sender, DirectEventArgs e)
        {
            try
            {
                var tipoAprobacion = e.ExtraParams["TipoAprobacion"];
                int planEstudioId;
                int.TryParse(e.ExtraParams["PlanEstudioId"], out planEstudioId);
                var criterio = AsignaturaCriteria.New();
                criterio.TipoAprobacion = tipoAprobacion;
                criterio.PlanEstudioId = planEstudioId;
                var listaAsignaturasPlan = AsignaturaList.Get(criterio);
                stoAsignaturasPLan.DataSource = listaAsignaturasPlan;
                stoAsignaturasPLan.DataBind();
                
               

            }
            catch (Exception ex)
            {
                ManejadorExcepcionesHelper.CatchExceptionLoad(ex, this.ManejadorExcepciones, this.ManejadorMensajes);
            }
        }

        [DirectMethod]
        protected void SeleccionarDatosEditar()
        {
            try
            {
                var objEquivalencia = Session["Equivalencia"] as Equivalencia;

                if (objEquivalencia.ComponenteId>0)
                cbxComponente.SetValueAndFireSelect(objEquivalencia.ComponenteId);
                else
                 cbxComponente.Reset();
                if (objEquivalencia.GrupoCreditoId > 0)
                cbxGrupo.SetValue(objEquivalencia.GrupoCreditoId);
                else
                 cbxGrupo.Reset();
                txtNumeroCreditos.SetValue(objEquivalencia.NumeroCreditos);
                if (objEquivalencia.PlanEstudioOrigenId > 0)
                    cbbPlanEstudio.SetValueAndFireSelect(objEquivalencia.PlanEstudioOrigenId);
                else
                    cbbPlanEstudio.Reset();
               
                var puedeEditarEliminar = EquivalenciaCmd.Execute(objEquivalencia.Id);
                if (puedeEditarEliminar)
                {
                    ExtNet.Js.Call("Sy.showMsgAlerta", "La equivalencia esta siendo usada en un Reconocimiento");
                }
            }
            catch (Exception ex)
            {
                ManejadorExcepcionesHelper.CatchExceptionLoad(ex, this.ManejadorExcepciones, this.ManejadorMensajes);
            }
        }

        /// <summary>
        /// Invoca metodo para actualizar datos de la grid
        /// </summary>
        private static void CallRefreshGridParent()
        {
            X.Js.AddScript("#{stoEquivalencias}.load();");
        }


        protected void btnEliminar_Click(object sender, DirectEventArgs e)
        {
            try
            {
                var objEquivalencia = Session["Equivalencia"] as Equivalencia;
                var puedeEditarEliminar = EquivalenciaCmd.Execute(objEquivalencia.Id);
                if (puedeEditarEliminar)
                {
                    ExtNet.Js.Call("Sy.showMsgAlerta", "La equivalencia esta siendo usada en un Reconocimiento");
                    return;
                }
                else
                {
                    objEquivalencia.Delete();
                    objEquivalencia.Save();
                    detailsWindow.Hide();
                    ExtNet.Js.Call("pgWindowEditor.eliminarExito");
                }
            }
            catch (Exception ex)
            {
                ManejadorExcepcionesHelper.CatchExceptionLoad(ex, this.ManejadorExcepciones, this.ManejadorMensajes);

            }
        }

        /// <summary>
        /// Evento Guardar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnGuardar_Click(object sender, DirectEventArgs e)
        {
            try
            {
                int estado, componenteId, grupoCreditoId, numeroCreditos, variacionProgramaAcademicoId, progAcadOrigenId = 0;

                int.TryParse(e.ExtraParams["Estado"], out estado);
                int.TryParse(e.ExtraParams["ComponenteId"], out componenteId);
                int.TryParse(e.ExtraParams["GrupoCreditoId"], out grupoCreditoId);
                int.TryParse(e.ExtraParams["Creditos"], out numeroCreditos);
                int.TryParse(e.ExtraParams["VariacionId"], out variacionProgramaAcademicoId);
                int.TryParse(e.ExtraParams["PlanId"], out progAcadOrigenId);

                var objEquivalencia = Session["Equivalencia"] as Equivalencia;
                var puedeEditarEliminar = EquivalenciaCmd.Execute(objEquivalencia.Id);
                if (puedeEditarEliminar)
                {
                    ExtNet.Js.Call("Sy.showMsgAlerta", "La equivalencia esta siendo usada en un Reconocimiento, solo se editara el estado");
                }
                else
                {
                    #region "Componentes Origen"

                    StoreDataHandler sdhComponentesOrigen = new StoreDataHandler(e.ExtraParams["ComponentesOrigen"]);
                    ChangeRecords<EquivalenciaComponente> crsdhComponentes =
                        sdhComponentesOrigen.ObjectData<EquivalenciaComponente>();

                    foreach (var item in crsdhComponentes.Deleted)
                    {
                        objEquivalencia.ComponentesOrigen.Remove(item);
                    }
                    // ComponentesOrigen : ComponentesOrigen debe tener por lo menos un item
                    foreach (var item in crsdhComponentes.Created)
                    {
                        objEquivalencia.ComponentesOrigen.Add(item);
                    }

                    #endregion

                    objEquivalencia.ComponenteId = componenteId;
                    objEquivalencia.CodigoComponente = e.ExtraParams["CodigoComponente"];
                        //  Codigo : El campo Codigo es obligatorio
                    objEquivalencia.NombreComponente = e.ExtraParams["NombreComponente"];
                    objEquivalencia.GrupoCreditoId = grupoCreditoId; //GrupoCreditoId : Este campo es obligatorio
                    objEquivalencia.NumeroCreditos = numeroCreditos;
                    objEquivalencia.VariacionProgramaAcademicoId = variacionProgramaAcademicoId;
                    objEquivalencia.Responsable = "UsuarioLogeado";
                        // Responsable : El campo Responsable es obligatorio;
                    objEquivalencia.FechaCreacion = DateTime.Now; //FechaInicio : The field FechaInicio is invalid.
                    objEquivalencia.FechaActulizacion = DateTime.Now;
                    objEquivalencia.PlanEstudioOrigenId = progAcadOrigenId;
                        // ProgramaAcademicoOrigenId : Este campo es obligatorio
                    objEquivalencia.Observacion = e.ExtraParams["Observacion"];
                }
                objEquivalencia.Estado = estado;

                if (objEquivalencia.IsValid)
                {
                    var ids = "";
                    foreach (var coe in objEquivalencia.ComponentesOrigen.OrderBy(co=>co.AsignaturaId))
                    {
                        ids = string.Format("{0}{1}",ids,coe.AsignaturaId);
                    }
                    if (EquivalenciaExistenteCmd.Execute(objEquivalencia.Id, ids, objEquivalencia.VariacionProgramaAcademicoId, objEquivalencia.ComponenteId))
                    {
                        ExtNet.Js.Call("Sy.showMsgAlerta", "Ya existe una equivalencia igual a la que esta guardando ahora.");
                        return;
                    }
                    else
                    {
                        objEquivalencia = objEquivalencia.Save();
                        detailsWindow.Hide();
                        ExtNet.Js.Call("pgWindowEditor.guardarExito");
                    }
                }
                else
                {
                    ExtNet.Js.Call("Sy.showMsgAlerta", objEquivalencia.GetBrokenRuleToString());
                    return;
                }

            }
            catch (Exception ex)
            {
                ManejadorExcepcionesHelper.CatchExceptionLoad(ex, this.ManejadorExcepciones, this.ManejadorMensajes);
            }
        }

        public void ClearWindowEditor()
        {
            this.cbxComponente.Value = "";
            this.cbxGrupo.Value = "";
            this.txtNumeroCreditos.Text = "0";
            this.cbbProgramaVariacion.Value = "";
            frpBuscadorProgramasAcademicos.Reset();
            cbbPlanEstudio.Reset();
            frpCompontDestino.Reset();
            txtObserv.Reset();
            this.grpCmp.GetStore().RemoveAll();
            //this.grpCmp.GetStore().DataBind();

        }
    }

}
